﻿#pragma once

#include "precomp.h"
#include "game_object.h"
#include "renders.h"
#include "patterns.h"
#include "bullet.h"
#include "resources.h"
#include "player.h"

const unsigned int MAX_EFFECTS=20000;

class Effect_Appearance;
class Effect_Behaviour;
class Bullet;

// Графические эффекты и частицы, не учавствующие в геймплее, в том числе отмершие пули
class Effect{
public:
	CL_Vec2<float> position;
	CL_Vec2<float> direction;
	CL_Angle orientation;
	float speed;
	float time_lived;
	unsigned int id;
	char active;
	char appearance_index; // Индекс в массиве однотипных отображений(например, разные цвета)
	int param_int; // Целый параметр для разных целей
	float param_float;
	CL_Color eff_color;

	Effect_Appearance *appearance;
	Effect_Behaviour *behaviour;
public:
	void Render(CL_GraphicContext &gc);
	void Update(float time);
};

class EffectsManager {
private:
	Effect *_effects;
	unsigned int *id_index_table;
	unsigned int active_effects_count;
	unsigned int next_free_id_slot;
public:
	EffectsManager();
	~EffectsManager();
	unsigned int Create(Effect &p_effect_description);
	unsigned int CreateBulletEffect(Bullet &bullet, int type);

	void Clear();
	void Update(float time);
	void Render(CL_GraphicContext &gc, CL_Rect &clip);
    Effect& GetEffectByID(unsigned int p_id);
};

extern EffectsManager effects;
